home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
gnu
/
amiga
/
bmake15.lzh
/
touch.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-09
|
2KB
|
98 lines
/* touch.c
* (c) Copyright 1991 by Ben Eng, All Rights Reserved
*
* Update the modification time of a file to the present time.
*/
#include <exec/memory.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
extern struct MsgPort *CreatePort( UBYTE *name, long pri );
extern void DeletePort( struct MsgPort *io );
#include <time.h>
#include "make.h"
/* return the current time */
time_t
nowtime( void )
{
struct DateStamp t;
time_t outtime = 0L;
DateStamp( &t );
outtime = t.ds_Tick/TICKS_PER_SECOND + 60*t.ds_Minute + 86400*t.ds_Days;
return( outtime );
}
static long
dos_packet( struct MsgPort *port, long type,
long arg1, long arg2, long arg3, long arg4, long arg5, long arg6, long arg7 )
{
struct StandardPacket *sp;
struct MsgPort *rp;
long ret;
if( !( rp = CreatePort( NULL, 0L )))
return( 1 );
if( !( sp = AllocMem( sizeof(*sp), MEMF_PUBLIC|MEMF_CLEAR))) {
DeletePort( rp );
return( 1 );
}
sp->sp_Msg.mn_Node.ln_Name = (char *)&sp->sp_Pkt;
sp->sp_Pkt.dp_Link = &sp->sp_Msg;
sp->sp_Pkt.dp_Port = rp;
sp->sp_Pkt.dp_Type = type;
sp->sp_Pkt.dp_Arg1 = arg1;
sp->sp_Pkt.dp_Arg2 = arg2;
sp->sp_Pkt.dp_Arg3 = arg3;
sp->sp_Pkt.dp_Arg4 = arg4;
sp->sp_Pkt.dp_Arg5 = arg5;
sp->sp_Pkt.dp_Arg6 = arg6;
sp->sp_Pkt.dp_Arg7 = arg7;
PutMsg( port, &sp->sp_Msg );
WaitPort( rp );
GetMsg( rp );
ret = sp->sp_Pkt.dp_Res1;
FreeMem( (void *)sp, sizeof(*sp) );
DeletePort(rp);
return( ret );
}
/* update the modification time of a file */
void
touch( const char *filename )
{
struct MsgPort *task = NULL;
BPTR lock = (BPTR)0L;
BPTR plock = (BPTR)0L;
char *bcplstring = NULL;
struct DateStamp dateStamp;
if( !( bcplstring = (char *)AllocMem(64L, MEMF_PUBLIC)))
goto death;
if( !( task = (struct MsgPort *)DeviceProc( filename )))
goto death;
if( !( lock = Lock( filename, SHARED_LOCK )))
goto death;
plock = ParentDir( lock );
UnLock( lock ); lock = NULL;
/* Strip pathnames first */
strcpy( bcplstring + 1, basename( filename ));
*bcplstring = (char)strlen(bcplstring + 1);
dos_packet( task, ACTION_SET_DATE, NULL, plock, (long)bcplstring >> 2,
(long) DateStamp( &dateStamp ), 0L, 0L, 0L);
death:
if( lock )
UnLock( lock );
if( plock )
UnLock( plock );
FreeMem((void *) bcplstring, 64L );
}